package com.open.cloud.rbac.utils;

import java.util.function.Supplier;

/**
 * 　　　　　　　　┏┓　　　┏┓+ +
 * 　　　　　　　┏┛┻━━━┛┻┓ + +
 * 　　　　　　　┃　　　　　　　┃
 * 　　　　　　　┃　　　━　　　┃ ++ + + +
 * 　　　　　　 ████━████ ┃+
 * 　　　　　　　┃　　　　　　　┃ +
 * 　　　　　　　┃　　　┻　　　┃
 * 　　　　　　　┃　　　　　　　┃ + +
 * 　　　　　　　┗━┓　　　┏━┛
 * 　　　　　　　　　┃　　　┃
 * 　　　　　　　　　┃　　　┃ + + + +
 * 　　　　　　　　　┃　　　┃　　　　   @Author: wang.yangtx　@Date:  2021/7/22 3:35 下午
 * 　　　　　　　　　┃　　　┃ + 　　　　神兽保佑,代码无bug
 * 　　　　　　　　　┃　　　┃
 * 　　　　　　　　　┃　　　┃　　+
 * 　　　　　　　　　┃　 　　┗━━━┓ + +
 * 　　　　　　　　　┃ 　　　　　　　┣┓
 * 　　　　　　　　　┃ 　　　　　　　┏┛
 * 　　　　　　　　　┗┓┓┏━┳┓┏┛ + + + +
 * 　　　　　　　　　　┃┫┫　┃┫┫
 * 　　　　　　　　　　┗┻┛　┗┻┛+ + + +
 */
public class SimpleResponse<T> {

    public final static int SUCCESS = 200;
    public final static int FAIL = 500;
    private final static String SUCCESS_MSG = "操作成功";
    private final static String FAIL_MSG = "操作失败";
    private int code = 0;
    private String msg = "";
    private T data;

    public SimpleResponse() {
    }

    private SimpleResponse(Builder<T> builder) {
        this.code = builder.code;
        this.msg = builder.msg;
        this.data = builder.data;
    }

    public static class Builder<T> {
        private int code = 0;
        private String msg = "";
        private T data;

        public Builder() {
        }

        public Builder<T> code(int code) {
            this.code = code;
            return this;
        }

        public Builder<T> msg(String msg) {
            this.msg = msg;
            return this;
        }

        public Builder<T> data(T data) {
            this.data = data;
            return this;
        }

        public SimpleResponse<T> build() {
            return new SimpleResponse<>(this);
        }
    }

    public static void main(String[] args) {
        SimpleResponse<String> simpleResponse = success("","");
        System.out.println(simpleResponse);
    }

    public static <T> SimpleResponse<T> success() {
        return new Builder<T>().code(SUCCESS).msg(SUCCESS_MSG).build();
    }

    public static <T> SimpleResponse<T> success(T data) {
        return new Builder<T>().code(SUCCESS).msg(SUCCESS_MSG).data(data).build();
    }

    public static <T> SimpleResponse<T> success(String msg, T data) {
        return new Builder<T>().code(SUCCESS).msg(msg).data(data).build();
    }


    public static <T> SimpleResponse<T> fail() {
        return new Builder<T>().code(FAIL).msg(FAIL_MSG).build();
    }

    public static <T> SimpleResponse<T> fail(String msg) {
        return new Builder<T>().code(FAIL).msg(msg).build();
    }
    public static <T> SimpleResponse<T> fail(String msg,Integer code) {
        return new Builder<T>().code(code).msg(msg).build();
    }

    public static <T> SimpleResponse<T> fail(String msg, T data) {
        return new Builder<T>().code(FAIL).msg(msg).data(data).build();
    }


    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public <X extends Exception> SimpleResponse<T> orGetThrow(Supplier<? extends X> exceptionSupplier) throws X {
        if (this.code == FAIL) {
            throw exceptionSupplier.get();
        }
        return this;
    }

    @Override
    public String toString() {
        return "SimpleResponse{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
}
